﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {
    /// <summary>
    /// クリップのアクティブ区間を定義する構造体
    /// </summary>
    /// <remarks>
    /// <see cref="AnimationClip"/>が有効である時刻(=アクティブ区間)をワールド時間で定義します。
    /// クリップはこの区間でのみ有効です。<c>Start</c>と<c>End</c>に同一の時刻をセットすると
    /// 常に有効になります(デフォルト)。
    /// <note type="implement">
    /// どうでもいいが Begin 〜 End だよな。
    /// </note>
    /// </remarks>
    public struct ActiveInterval {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <remarks>
        /// アクティブ区間は<paramref name="startTime"/>を含み<paramref name="endTime"/>を含みません。
        /// </remarks>
        /// <param name="startTime">アクティブ区間の開始時刻(ワールド時間)</param>
        /// <param name="endTime">アクティブ区間の終了時刻(ワールド時間)</param>
        internal ActiveInterval (int startTime, int endTime)
            : this () {
            this.Start = startTime;
            this.End = endTime;
        }

        /// <summary>
        /// アクティブ区間の開始時刻(ワールド時間)
        /// </summary>
        public int Start { get; private set; }

        /// <summary>
        /// アクティブ区間の終了時刻(ワールド時間)
        /// </summary>
        public int End { get; private set; }

        /// <summary>
        /// 指定の時刻以降で始まるアクティブな時刻を取得する
        /// </summary>
        /// <param name="time">時刻(ワールド時間)</param>
        /// <returns>時刻(ワールド時間)</returns>
        public int GetActiveStart (int time) {
            return (Start == End) ? time : Math.Max (time, Start);
        }

        /// <summary>
        /// 指定の時刻以前で最後にアクティブな時刻を取得する
        /// </summary>
        /// <param name="endTime">時刻(ワールド時間)</param>
        /// <returns>時刻(ワールド時間)</returns>
        public int GetActiveEnd (int endTime) {
            return (Start == End) ? endTime : Math.Min (endTime, End);
        }

    }
    
}
